package com.spring.component.rabbitmq.sender;

import com.spring.component.rabbitmq.Properties;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;

/**
 * 抽象类，子类实现抽象方法，提供AmqpTemplate和ConnectionFactory， 父类通过抽象方法实现发送消息
 * 
 * @author liushihua
 * @since 2018年04月11日
 */
public abstract class BaseSender {

  /**
   * 发送消息,交换机为amqp配置的默认的无名交换机
   * 
   * @param routingKey
   * @param message
   * @throws AmqpException
   */
  public void convertAndSend(String routingKey, Object message) throws AmqpException {
    this.getRabbitTemplate().convertAndSend(routingKey, message);
  }

  /**
   * 发送消息，指定交换机
   * 
   * @param exchange 交换机名称
   * @param routingKey
   * @param message 消息实体
   * @throws AmqpException
   */
  public void convertAndSend(String exchange, String routingKey, Object message)
      throws AmqpException {
    this.getRabbitTemplate().convertAndSend(exchange, routingKey, message);
  }

  /**
   * 发送消息到TOPIC_EXCHANGE交换机
   * 
   * @param routingKey
   * @param message
   * @throws AmqpException
   */
  public void convertAndSendTopic(String routingKey, Object message) throws AmqpException {
    this.getRabbitTemplate().convertAndSend(Properties.TOPIC_EXCHANGE, routingKey, message);
  }

  /**
   * 获取rabbitMq，由子类实现
   * 
   * @return
   */
  public abstract AmqpTemplate getRabbitTemplate();

  public abstract ConnectionFactory getConnectionFactory();
}
